package class

import (
	"encoding/json"
	"reflect"

	log "github.com/jeanphorn/log4go"
)

//Object 所有对象的父类
type Object interface {
	ToString()
	ToJSON()
}

//UserObj 用户基本类
type UserObj struct {
	//ID 数据表ID
	ID int `json:"id"`
	//UserID
	UserID string `json:"user_id"`
	//UserName 用户名
	UserName string `json:"username"`
	//Password 用户密码
	Password string `json:"password"`
	//State 用户状态(0:正常,1:禁言,2:封号)
	State int `json:"state"`
	//HeadURL 头像链接
	HeadURL string `json:"head_url"`
	//IP 用户登陆时的ip
	IP string `json:"ip"`
	//Email 用户邮箱
	Email string `json:"email"`
	//Tel 用户电话
	Tel string `json:"tel"`
	//RegTime 注册时间
	RegTime string `json:"reg_time" sql:"reg_time"`
	//LastActiveTime 最后一次活动时间
	LastActiveTime string `json:"last_active_time" sql:"last_active_time"`
	//Token token登陆凭据
	Token string `json:"token" sql:"token"`
}

//ToAddrList 将对象属性转换为地址列表，转为[&Value1,&Value2,&Value3]
func (u *UserObj) ToAddrList() (addrList []interface{}) {
	t := reflect.TypeOf(*u)
	v := reflect.ValueOf(u)
	in := reflect.Indirect(v)

	for i := 0; i < t.NumField(); i++ {
		addrList = append(addrList, in.Field(i).Addr().Interface())
	}
	return
}

//Clear 清空对象
func (u *UserObj) Clear() {
	*u = UserObj{}
}

//Object2Map 结构体转Map
func Object2Map(obj interface{}) (data map[string]interface{}, err error) {
	data = make(map[string]interface{})
	objT := reflect.TypeOf(obj)
	objV := reflect.ValueOf(obj)
	for i := 0; i < objT.NumField(); i++ {
		data[objT.Field(i).Name] = objV.Field(i).Interface()
	}
	err = nil
	return
}

//ToJSON 将UserObj的值以 "value1,value2,value3" 的形式返回
func (u UserObj) ToJSON() interface{} {
	buf, err := json.Marshal(u)
	if err != nil {
		log.LOGGER("USER").Error("用户对象转换JSON失败:%v", err)
	}
	return string(buf)
}
